console.log('(Server) Hello World!');
// 游戏状态类型定义
type GameState = 'waiting' | 'preparing' | 'playing' | 'ending';

// 玩家游戏数据接口
interface PlayerGameData {
  player: GamePlayer;
  entity: GameEntity;
  joinTime: number;
  finishTime?: number; // 通关时间(秒)，未通关则为undefined
}

let gameState: GameState = 'waiting';
let registrationList: PlayerGameData[] = []; // 报名列表
let gameTimer: number | null = null; // 游戏计时器ID
let remainingTime = 0; // 剩余时间(秒)
let gameStartTime = 0;
let prepareInterval: number | null = null; // 准备阶段计时器ID

// 获取模型A和模型B（假设它们的ID分别为'modelA'和'modelB'）
const modelA = world.querySelector('#modelA');
const modelB = world.querySelector('#modelB');

// 工具函数：格式化时间（秒 -> 分:秒）
function formatTime(seconds: number): string {
  const mins = Math.floor(seconds / 60);
  const secs = seconds % 60;
  return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}

// 初始化模型互动
function initModels() {
  // 模型A：用于玩家报名
  if (modelA) {
    modelA.enableInteract = true;
    modelA.interactHint = '点击报名参加游戏';
    modelA.interactRadius = 10;
    
    modelA.onInteract((event: GameInteractEvent) => {
      const { entity } = event;
      if (!entity.isPlayer || !entity.player) return;
      
      // 检查是否已报名
      const isRegistered = registrationList.some(
        data => data.player.userKey === entity.player.userKey
      );
      
      if (gameState === 'waiting' || gameState === 'preparing') {
        if (!isRegistered) {
          registrationList.push({
            player: entity.player,
            entity: entity,
            joinTime: Date.now()
          });
          entity.player.directMessage('报名成功！当前报名人数：' + registrationList.length);
          world.say(`${entity.player.name} 已报名参加游戏`);
        } else {
          entity.player.directMessage('你已经报名了！');
        }
      } else {
        entity.player.directMessage('当前无法报名，请等待下一轮游戏');
      }
    });
  } else {
    console.warn('未找到模型A（#modelA），报名功能将无法使用');
  }
  
  // 模型B：用于完成游戏
  if (modelB) {
    modelB.enableInteract = true;
    modelB.interactHint = '点击完成游戏';
    modelB.interactRadius = 10;
    
    modelB.onInteract((event: GameInteractEvent) => {
      const { entity } = event;
      if (!entity.isPlayer || !entity.player) return;
      
      if (gameState === 'playing') {
        const playerData = registrationList.find(
          data => data.player.userKey === entity.player.userKey
        );
        
        if (playerData && playerData.finishTime === undefined) {
          // 记录完成时间
          playerData.finishTime = Math.floor((Date.now() - gameStartTime) / 1000);
          remainingTime = 180 - playerData.finishTime;
          
          // 向所有玩家广播
          world.say(`${playerData.player.name} 成功通关！用时 ${formatTime(playerData.finishTime)}`);
          playerData.player.directMessage(`恭喜你成功通关！用时 ${formatTime(playerData.finishTime)}`);
        }
      } else {
        entity.player.directMessage('游戏尚未开始或已结束');
      }
    });
  } else {
    console.warn('未找到模型B（#modelB），通关功能将无法使用');
  }
}

// 处理玩家离开游戏
function handlePlayerLeave() {
  world.onPlayerLeave(({ entity }) => {
    if (!entity.isPlayer || !entity.player) return;
    
    // 从报名列表中移除离开的玩家
    registrationList = registrationList.filter(
      data => data.player.userKey !== entity.player.userKey
    );
    
    world.say(`${entity.player.name} 已离开游戏`);
  });
}

// 开始准备阶段
function startPreparing() {
  // 清除可能存在的计时器
  if (prepareInterval) clearInterval(prepareInterval);
  
  gameState = 'preparing';
  remainingTime = 30; // 准备时间30秒
  world.say(`游戏即将开始！报名时间剩余 ${remainingTime} 秒`);
  
  // 每1秒更新一次倒计时
  prepareInterval = setInterval(() => {
    if (gameState !== 'preparing') {
      clearInterval(prepareInterval!);
      return;
    }
    
    remainingTime--;
    
    // 时间提示逻辑
    if (remainingTime <= 0) {
      clearInterval(prepareInterval!);
      startGame();
      return;
    }
    
    // 关键时间点提示
    if (remainingTime % 15 === 0 || remainingTime <= 10) {
      world.say(`游戏将在 ${remainingTime} 秒后开始！当前报名人数：${registrationList.length}`);
    }
  }, 1000);
}

// 开始游戏
function startGame() {
  // 如果没有玩家报名，直接进入下一轮
  if (registrationList.length === 0) {
    world.say('没有玩家报名，将重新开始报名阶段');
    startPreparing();
    return;
  }
  
  gameState = 'playing';
  gameStartTime = Date.now();
  remainingTime = 180; // 游戏时间3分钟(180秒)
  
  world.say(`游戏开始！所有玩家已传送至起点，限时 ${formatTime(remainingTime)}`);
  
  // 将所有报名玩家传送到(0,0,0)
  registrationList.forEach(data => {
    data.player.directMessage('游戏开始！尽快找到并互动模型B完成挑战');
    //这里可加data.position.set()
  });
  
  // 游戏计时器
  gameTimer = setInterval(() => {
    if (gameState !== 'playing') {
      if (gameTimer) clearInterval(gameTimer);
      return;
    }
    
    remainingTime--;
    
    // 时间提示逻辑
    if (remainingTime % 15 === 0 || remainingTime <= 10) {
      world.say(`游戏结束剩余 ${formatTime(remainingTime)}`);
    }
    
    // 检查是否所有玩家都已完成
    const allFinished = registrationList.every(data => data.finishTime !== undefined);
    if (allFinished) {
      world.say('所有玩家均已完成挑战，游戏提前结束！');
      endGame();
      return;
    }
    
    // 游戏结束
    if (remainingTime <= 0) {
      endGame();
    }
  }, 1000);
}

// 结束游戏
function endGame() {
  // 清除计时器
  if (gameTimer) clearInterval(gameTimer);
  gameState = 'ending';
  
  world.say('游戏结束！正在统计结果...');
  
  // 将剩余玩家传送回出生点(0,0,0)
  registrationList.forEach(data => {
    //这里可加data.position.set()
  });
  
  // 准备玩家成绩信息（按完成时间排序）
  const sortedResults = [...registrationList].sort((a, b) => {
    if (a.finishTime === undefined) return 1;
    if (b.finishTime === undefined) return -1;
    return a.finishTime - b.finishTime;
  });
  
  let resultText = '游戏结果：\n';
  sortedResults.forEach((data, index) => {
    if (data.finishTime !== undefined) {
      resultText += `${index + 1}. ${data.player.name} - 成功，用时 ${formatTime(data.finishTime)}\n`;
    } else {
      resultText += `${index + 1}. ${data.player.name} - 未完成\n`;
    }
  });
  
  // 向所有玩家显示结果对话框
  const allPlayers = world.querySelectorAll('player');
  allPlayers.forEach(entity => {
    if (entity.isPlayer && entity.player) {
      entity.player.dialog({
        type: GameDialogType.TEXT,
        title: "游戏结束",
        content: resultText
      });
    }
  });
  
  // 显示结果后，清空报名列表并等待30秒重新开始
  setTimeout(() => {
    registrationList = [];
    world.say('下一轮游戏将在30秒后开始，玩家可以开始报名');
    startPreparing();
  }, 10000); // 显示结果10秒后进入下一轮
}

// 初始化游戏
function initGame() {
  initModels();
  handlePlayerLeave(); // 注册玩家离开事件
  
  // 初始状态为等待，立即开始准备阶段
  world.say('欢迎来到挑战游戏！请与模型A（#modelA）互动报名参加');
  startPreparing();
}
// 46f43b1d912b7a2e9b656ecfff52a55f
// 启动游戏
initGame();